using System;
using System.Collections.Generic;
using Csla;
using ENT.GP.Datos.MysqlHelper;
using MySql.Data.MySqlClient;
using System.Data;

namespace ENT.GP.Core.Proyecto
{
    [Serializable]
    public class ProyectoComponentes :
      BusinessListBase<ProyectoComponentes, ProyectoComponente>
    {
        #region Factory Methods

        internal static ProyectoComponentes NewProyectoComponentes()
        {
            return DataPortal.CreateChild<ProyectoComponentes>();
        }

        internal static ProyectoComponentes GetProyectoComponentes(int idProy)
        {
            return DataPortal.FetchChild<ProyectoComponentes>(idProy);
        }

        private ProyectoComponentes()
        { }

        #endregion

        #region Data Access

        private void Child_Fetch(int idProy)
        {
            RaiseListChangedEvents = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[1];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", idProy);
            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Obtener_Proyecto_Componente").Tables[0].Rows)
            {
                this.Add(ProyectoComponente.GetProyectoComponente(items));
            }

            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class ProyectoComponente : BusinessBase<ProyectoComponente>
    {
        #region Business Methods

        private static PropertyInfo<string> IdProperty = RegisterProperty<string>(o => o.Id, "Name");
        public string Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<int> ProyectoIdProperty = RegisterProperty<int>(o => o.ProyectoId, "Name");
        public int ProyectoId
        {
            get { return GetProperty(ProyectoIdProperty); }
            set { SetProperty(ProyectoIdProperty, value); }
        }

        private static PropertyInfo<int> EstadoIdProperty = RegisterProperty<int>(o => o.EstadoId, "Name");
        public int EstadoId
        {
            get { return GetProperty(EstadoIdProperty); }
            set { SetProperty(EstadoIdProperty, value); }
        }

        private static PropertyInfo<string> NombreProperty = RegisterProperty<string>(o => o.Nombre, "Name");
        public string Nombre
        {
            get { return GetProperty(NombreProperty); }
            set { SetProperty(NombreProperty, value); }
        }

        private static PropertyInfo<string> DescripcionProperty = RegisterProperty<string>(o => o.Descripcion, "Name");
        public string Descripcion
        {
            get { return GetProperty(DescripcionProperty); }
            set { SetProperty(DescripcionProperty, value); }
        }

        private static PropertyInfo<int> PaisIdProperty = RegisterProperty<int>(o => o.PaisId, "Name");
        public int PaisId
        {
            get { return GetProperty(PaisIdProperty); }
            set { SetProperty(PaisIdProperty, value); }
        }

        private static PropertyInfo<string> EjecutorProperty = RegisterProperty<string>(o => o.Ejecutor, "Name");
        public string Ejecutor
        {
            get { return GetProperty(EjecutorProperty); }
            set { SetProperty(EjecutorProperty, value); }
        }

        private static PropertyInfo<string> ObservacionProperty = RegisterProperty<string>(o => o.Observacion, "Name");
        public string Observacion
        {
            get { return GetProperty(ObservacionProperty); }
            set { SetProperty(ObservacionProperty, value); }
        }

        private static PropertyInfo<double> PorcentajeAvanceProperty = RegisterProperty<double>(o => o.PorcentajeAvance, "Name");
        public double PorcentajeAvance
        {
            get { return GetProperty(PorcentajeAvanceProperty); }
            set { SetProperty(PorcentajeAvanceProperty, value); }
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Authorization Rules

        protected override void AddAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowWrite("Name", "Role");
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowEdit(typeof(ProyectoComponente), "Role");
        }

        #endregion

        #region Factory Methods

        internal static ProyectoComponente NewProyectoComponente()
        {
            return DataPortal.CreateChild<ProyectoComponente>();
        }

        internal static ProyectoComponente GetProyectoComponente(DataRow childData)
        {
            return DataPortal.FetchChild<ProyectoComponente>(childData);
        }

        public ProyectoComponente()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        protected override void Child_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.Child_Create();
        }

        private void Child_Fetch(DataRow childData)
        {
            // TODO: load values
            LoadProperty(IdProperty, childData[0].ToString());
            LoadProperty(ProyectoIdProperty, Convert.ToInt32(childData[1].ToString()));            
            LoadProperty(EstadoIdProperty, Convert.ToInt32(childData[2].ToString()));
            LoadProperty(NombreProperty, childData[3].ToString());
            LoadProperty(PaisIdProperty, Convert.ToInt32(childData[4].ToString()));
            LoadProperty(DescripcionProperty, childData[5].ToString());
            LoadProperty(EjecutorProperty, childData[6].ToString());
            LoadProperty(ObservacionProperty, childData[7].ToString());
            LoadProperty(PorcentajeAvanceProperty, Convert.ToDouble(childData[8].ToString()));

        }

        private void Child_Insert(int idPadre)
        {
            // TODO: insert values 
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[9];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("ID", ReadProperty(IdProperty));                
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDP", idPadre);                
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("IDE", ReadProperty(EstadoIdProperty));
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("N", ReadProperty(NombreProperty));
                parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("D", ReadProperty(DescripcionProperty));
                parametros[5] = new MySql.Data.MySqlClient.MySqlParameter("IDPAIS", ReadProperty(PaisIdProperty));
                parametros[6] = new MySql.Data.MySqlClient.MySqlParameter("E", ReadProperty(EjecutorProperty));
                parametros[7] = new MySql.Data.MySqlClient.MySqlParameter("O", ReadProperty(ObservacionProperty));
                parametros[8] = new MySql.Data.MySqlClient.MySqlParameter("PA", ReadProperty(PorcentajeAvanceProperty));

                objhm.EjecutarStoreProcedure("Insertar_Proyecto_Componente", parametros);

            }
            catch (Exception)
            {

                throw;
            }
        }

        private void Child_Update(object parent)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[8];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("ID", ReadProperty(IdProperty));
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDE", ReadProperty(EstadoIdProperty));
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("N", ReadProperty(NombreProperty));
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("D", ReadProperty(DescripcionProperty));
                parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("IDP", ReadProperty(PaisIdProperty));
                parametros[5] = new MySql.Data.MySqlClient.MySqlParameter("E", ReadProperty(EjecutorProperty));
                parametros[6] = new MySql.Data.MySqlClient.MySqlParameter("O", ReadProperty(ObservacionProperty));
                parametros[7] = new MySql.Data.MySqlClient.MySqlParameter("PA", ReadProperty(PorcentajeAvanceProperty));

                objhm.EjecutarStoreProcedure("Actualizar_Proyecto_Componente", parametros);

            }
            catch (Exception)
            {

                throw;
            }
        }

        private void Child_DeleteSelf(object parent)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySqlParameter[] parametros = new MySqlParameter[1];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDC", ReadProperty(IdProperty));
                objhm.EjecutarStoreProcedure("Eliminar_Proyecto_Componente", parametros);
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
